package com.googlecode.openauth.web.util;

import org.apache.ibatis.session.RowBounds;
import org.springframework.util.DigestUtils;

import com.googlecode.openauth.web.entity.ActionPageBean;

public class Util {

	//private static Logger logger = Logger.getLogger(Util.class);

	public static String encode(String s) {
		if (s == null) {
			return null;
		}
		return DigestUtils.md5DigestAsHex(s.getBytes());
	}
	
	public static boolean isEmpty(String s){
		if(s == null){
			return true;
		}
		
		if(s.equalsIgnoreCase("")){
			return true;
		}
		
		return false;
	}

	/**
	 * 计算下一页的方法
	 * 
	 * @param pageBean
	 */
	public <T> RowBounds  calcNextRowBounds (ActionPageBean<T> pageBean) {
		// logger.info(" input page bean : " + pageBean);
		int offset = 0;
		int limit = pageBean.getPageNum();
		int totalCount = pageBean.getTotalCount();

		// 检查条件上边界
		checkUpperBound(pageBean);

		// 检查传入参数的下边界
		checklowerBound(pageBean);

		int inCurrentPageNo = pageBean.getCurrentPageNo();
		int inPrevPageNo = pageBean.getPrevPageNo();
		// int inNextPageNo = pageBean.getNextPageNo();

		int currentTotalNo = inCurrentPageNo * limit;
		if (currentTotalNo < totalCount) {
			// 还未到最后一页
			int currentPageNo = inCurrentPageNo + 1;
			offset = (inCurrentPageNo * limit) + 1;

			pageBean.setCurrentPageNo(currentPageNo);

			// 判断翻页之后是否到达最后一页

			// 翻页之后还未到达最后一页
			int nextPageNo = currentPageNo;
			int prevPageNo = inPrevPageNo;
			if (currentPageNo * limit < totalCount) {
				nextPageNo = currentPageNo + 1;
				prevPageNo = inCurrentPageNo;
				pageBean.setPrevPageNo(prevPageNo);
				pageBean.setNextPageNo(nextPageNo);
			}

			pageBean.setPrevPageNo(prevPageNo);
			pageBean.setNextPageNo(nextPageNo);
		} else if (currentTotalNo == totalCount) {
			// 刚好到最后一页
			offset = (inCurrentPageNo - 1) * limit + 1;
		} else {
			// 已经到最后一页
			//offset = inCurrentPageNo * limit;
			offset = (inCurrentPageNo - 1) * limit + 1;
		}

		if (offset - 1 >= 0) {
			offset = offset - 1;
		}

		RowBounds rowBounds = new RowBounds(offset, limit);
		return rowBounds;
	}

	private <T> void checkUpperBound(ActionPageBean<T> pageBean) {
		int maxPageNo = getMaxPageNo(pageBean);
		int checkNextPageNo = pageBean.getNextPageNo();
		if (checkNextPageNo > maxPageNo) {
			pageBean.setNextPageNo(maxPageNo);
		}

		int checkCurPageNo = pageBean.getCurrentPageNo();
		if (checkCurPageNo > maxPageNo) {
			pageBean.setCurrentPageNo(maxPageNo);
		}

		int checkPrevPageNo = pageBean.getPrevPageNo();
		if (checkPrevPageNo > maxPageNo) {
			pageBean.setPrevPageNo(maxPageNo);
		}

		// 检查前一页与当前页的大小关系
		int modifiedPrevPageNo = pageBean.getPrevPageNo();
		int modifiedCurrentPageNo = pageBean.getCurrentPageNo();
		if (modifiedCurrentPageNo < modifiedPrevPageNo) {
			if (modifiedPrevPageNo + 1 < maxPageNo) {
				pageBean.setCurrentPageNo(modifiedPrevPageNo + 1);
			} else {
				pageBean.setCurrentPageNo(modifiedPrevPageNo);
			}
		}

		// 检查后一页与当前页的大小关系
		int modifiedNextPageNo = pageBean.getNextPageNo();
		if (modifiedNextPageNo < modifiedCurrentPageNo) {
			if (modifiedCurrentPageNo + 1 < maxPageNo) {
				pageBean.setNextPageNo(modifiedCurrentPageNo + 1);
			} else {
				pageBean.setNextPageNo(maxPageNo);
			}
		}
	}

	private <T> void checklowerBound(ActionPageBean<T> pageBean) {
		int checkNextPageNo = pageBean.getNextPageNo();
		if (checkNextPageNo < 1) {
			pageBean.setNextPageNo(1);
		}

		int checkCurPageNo = pageBean.getCurrentPageNo();
		if (checkCurPageNo < 1) {
			pageBean.setCurrentPageNo(1);
		}

		int checkPrevPageNo = pageBean.getPrevPageNo();
		if (checkPrevPageNo < 1) {
			pageBean.setPrevPageNo(1);
		}

		int maxPageNo = getMaxPageNo(pageBean);
		// 检查前一页与当前页的大小关系
		int modifiedPrevPageNo = pageBean.getPrevPageNo();
		int modifiedCurrentPageNo = pageBean.getCurrentPageNo();
		if (modifiedCurrentPageNo < modifiedPrevPageNo) {
			if (modifiedPrevPageNo + 1 < maxPageNo) {
				pageBean.setCurrentPageNo(modifiedPrevPageNo + 1);
			} else {
				pageBean.setCurrentPageNo(modifiedPrevPageNo);
			}
		}

		// 检查后一页与当前页的大小关系
		int modifiedNextPageNo = pageBean.getNextPageNo();
		if (modifiedNextPageNo < modifiedCurrentPageNo) {
			if (modifiedCurrentPageNo + 1 < maxPageNo) {
				pageBean.setNextPageNo(modifiedCurrentPageNo + 1);
			} else {
				pageBean.setNextPageNo(maxPageNo);
			}
		}
	}

	public <T> int getMaxPageNo(ActionPageBean<T> pageBean) {
		
		int maxPage = 1;
		
		int totalCount = pageBean.getTotalCount();
		int limit = pageBean.getPageNum();
		int leftMaxPage = totalCount / limit;
		int rightMaxPage = totalCount / limit + 1;
		if (leftMaxPage * limit == totalCount) {
			maxPage = leftMaxPage;
		}

		if (leftMaxPage * limit < totalCount
				&& totalCount <= rightMaxPage * limit) {
			maxPage = rightMaxPage;
		}

		if(maxPage < 1){
			maxPage = 1;
		}
		
		return maxPage;
	}

	/**
	 * 计算下一页的方法
	 * 
	 * @param pageBean
	 */
	public <T> RowBounds calcPrevRowBounds(ActionPageBean<T> pageBean) {
		int offset = 0;
		int limit = pageBean.getPageNum();

		// 检查条件上边界
		checkUpperBound(pageBean);

		// 检查传入参数的下边界
		checklowerBound(pageBean);

		int inCurrentPageNo = pageBean.getCurrentPageNo();

		int maxPageNo = getMaxPageNo(pageBean);
		
		int modifiedPrevPageNo = pageBean.getPrevPageNo();
		int modifiedCurrentPageNo = pageBean.getCurrentPageNo();
		int modifiedNextPageNo = pageBean.getNextPageNo();
		// 是否达到第一页
		if ((inCurrentPageNo - 1) <= 1) {
			modifiedPrevPageNo = 1;
			modifiedCurrentPageNo = 1;
			if(modifiedCurrentPageNo + 1 <= maxPageNo){
				modifiedNextPageNo = modifiedCurrentPageNo + 1;
			}else{
				modifiedNextPageNo = 1;
			}
		}else{
			modifiedPrevPageNo = inCurrentPageNo - 2;
			if(modifiedPrevPageNo <= 1){
				modifiedPrevPageNo = 1;
			}
			modifiedCurrentPageNo = inCurrentPageNo - 1;
			modifiedNextPageNo = inCurrentPageNo;
		}
		
		pageBean.setCurrentPageNo(modifiedCurrentPageNo);
		pageBean.setPrevPageNo(modifiedPrevPageNo);
		pageBean.setNextPageNo(modifiedNextPageNo);

		offset = (modifiedCurrentPageNo - 1) * limit + 1;
		
		if (offset - 1 >= 0) {
			offset = offset - 1;
		}

		RowBounds rowBounds = new RowBounds(offset, limit);
		return rowBounds;
	}
}
